package com.zc.config;

import com.alibaba.druid.pool.DruidDataSource;
import com.github.pagehelper.PageHelper;
import com.zc.custom.CustomInterceptor;
import com.zc.property.DataSourceProperty;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.boot.autoconfigure.ConfigurationCustomizer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import javax.sql.DataSource;
import java.util.Properties;

/**
 * @description:
 * @author: cong
 * @create: 2024/12/27
 */
@Configuration
public class MybatisConfig {
    @Autowired
    private DataSourceProperty dataSourceProperty;
    @Bean
    public DataSource dataSource() {
        DruidDataSource druidDataSource = new DruidDataSource();
        druidDataSource.setUrl(dataSourceProperty.getUrl());
        druidDataSource.setUsername(dataSourceProperty.getUsername());
        druidDataSource.setPassword(dataSourceProperty.getPassword());
        return druidDataSource;
    }

    @Bean
    public DataSourceTransactionManager dataSourceTransactionManager(DataSource dataSource) {
        DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager();
        dataSourceTransactionManager.setDataSource(dataSource);
        return dataSourceTransactionManager;
    }


    /**
     * 创建并配置PageHelper bean
     *
     * PageHelper 是一个分页插件，它可以帮助我们更容易地实现分页功能
     * 这个方法负责初始化 PageHelper 实例，并设置其属性，以便在应用程序中使用
     *
     * @return PageHelper 实例，已配置好属性， ready to be used in the application
     */
    @Bean
    public PageHelper pageHelper() {
        // 创建 PageHelper 实例
        PageHelper pageHelper = new PageHelper();

        // 创建 Properties 对象，用于存储 PageHelper 的配置属性
        Properties properties = new Properties();

        // 设置数据库方言为 MySQL，这告诉 PageHelper 如何与 MySQL 数据库交互以实现分页
        properties.setProperty("helperDialect", "mysql");

        // 启用合理化分页，这将避免一些分页查询中的性能问题
        properties.setProperty("reasonable", "true");

        // 支持通过方法参数来传递分页信息，这样可以更灵活地进行分页查询
        properties.setProperty("supportMethodsArguments", "true");

        // 将配置属性设置到 PageHelper 实例中
        pageHelper.setProperties(properties);

        // 返回配置好的 PageHelper 实例
        return pageHelper;
    }
}
